/**
 * 
 */
package logica.colecciones;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import logica.colecciones.Limites;
import java.io.Serializable;
/**
 * @author pity
 *
 */
public class Fronteras implements Serializable{
	private Limites[] fronteras;
	private static Fronteras instancia;
	private final static long serialVersionUID = 1;
	/**
	 * @param fronteras
	 * Inicializa el grafo con la cantidad de nodos pasado por par�metros
	 */
	private Fronteras() {
		/*fronteras =	new Limites[5];
			for (int i = 0; i < 5; i++) {
				List<Integer> limites = new ArrayList<Integer>();
				fronteras[i] = new Limites(limites); 
			}
			*/
	}
	
	public void setFronteras(Limites[] limites){
		fronteras = limites;
	}
	
	public static Fronteras getInstancia(){
		if (instancia == null)
			instancia = new Fronteras();
		return instancia;
	}
	
	public void agregarArista (Integer codigoPais, Integer codigoPaisVecino){
		fronteras[codigoPais].insert(codigoPaisVecino);
		fronteras[codigoPaisVecino].insert(codigoPais);
	}
	
	public boolean hayArista(Integer codigoPais, Integer codigoPaisVecino){
		return fronteras[codigoPais].member(codigoPaisVecino); 
	}
		
	//Pre condici�n: numeroDesde y numeroHasta deben estar en el ArrayList de codigosPais 
	//Verifica si hay camino entre los nodos pasados por codigoPaise nodos pasado por par�metros
//	public boolean hayCamino(int numeroDesde, int numeroHasta, ArrayList<Integer> codigosPais){
//		List<Integer> listaAdyacentes = this.fronteras[numeroDesde].getLimites(); 
//	    boolean esta= false;
//		if(listaAdyacentes.contains(numeroHasta)){
//	    	esta = true;	
//	    }else{	    	
//			if(!listaAdyacentes.isEmpty() && codigosPais.contains(numeroDesde)){
//	    	   Iterator <Integer> iter = listaAdyacentes.iterator();
//	    	   while (iter.hasNext()){
//	    		   int desde = iter.next();
////	    		   int desde = listaAdyacentes.get(cod);
////	    		   if (codigosPais.contains(desde))
//	    			   return hayCamino(desde, numeroHasta, codigosPais);
//	    	   }	    	 
//			}		
//		}
//	    return esta;
//	}
	public boolean hayCamino(int numeroDesde, int numeroHasta, ArrayList<Integer> codigosPais){
		ArrayList<Integer> visitados = new ArrayList<Integer>();
		boolean esta = hayCaminoDFS(numeroDesde,numeroHasta,codigosPais,visitados); 
		return esta;
	}
	
	public boolean hayCaminoDFS(int numeroDesde, int numeroHasta, ArrayList<Integer> codigosPais, ArrayList<Integer> visitados){
		visitados.add(numeroDesde);
		List<Integer> listaAdyacentes = this.fronteras[numeroDesde].getLimites(); 
	    boolean esta= false;
		if(listaAdyacentes.contains(numeroHasta)){
	    	esta = true;	
	    }else{	    	
    	   Iterator <Integer> iter = listaAdyacentes.iterator();
    	   while (iter.hasNext() && !esta){
    		   int desde = iter.next();
    		   if (codigosPais.contains(desde) && !visitados.contains(desde))
    			   esta =  hayCaminoDFS(desde, numeroHasta, codigosPais,visitados);
    	   }	    	 	
		}
	    return esta;
	}
	
	         
	public boolean vacio(){
		int i =0;
		boolean vacio = true;
		while(i<fronteras.length && vacio){
			if(!fronteras[i].getLimites().isEmpty())
				vacio = false;
				i++;
		}
		return vacio;
		}
      public int valor(){
    	  return fronteras.length;
      }                                                 
}
